package com.niit.musicserver.service.impl;

import com.niit.musicserver.entity.domain.Song;
import com.niit.musicserver.entity.domain.SonglistSong;
import com.niit.musicserver.mapper.SongMapper;
import com.niit.musicserver.mapper.SonglistSongMapper;
import com.niit.musicserver.service.SongService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;
import java.util.List;

/**
 * @Description:
 * @Author: cheng_jianzhen
 * @CreateTime： 2024/1/18 9:55
 */
@Service
public class SongServiceImpl implements SongService {

    @Autowired
    private SongMapper songMapper;

    @Autowired
    private SonglistSongMapper songlistSongMapper;

    
    /**
     * @Description: 根据歌单id查询所有歌曲列表(没有分页)
     * @Author: cheng_jianzhen
     * @CreateTime: 2024/1/18 9:57
     * @param: songlistId 
     * @return: java.util.List<com.niit.musicserver.entity.domain.Song>
     **/
    @Override
    public List<Song> getListBySonglistId(Integer songlistId){
        return songMapper.getListBySonglistId(songlistId);
    }



    /**
 * @Description: 添加新的歌曲到指定歌单中
     * step1：【写操作】 将歌单添加到歌曲表中
     * step2:【读操作】 将歌曲添加到歌单中（建立关联关系）：添加中间表记录
     * @Author: cheng_jianzhen
 * @CreateTime: 2024/1/18 11:17
 * @param: songlistId  歌单ID
 * @param: song  要添加的歌曲信息
 * @return: int  插入记录数
 **/
    @Override
    //声明式事物注解
    @Transactional
    public int addSongToSonglist(Integer songlistId,Song song) {
        //step1、【写操作】将歌曲添加到歌曲表中:
        song.setCreateTime(new Date());
        int rows = songMapper.insertSong(song);
//        log.info("插入后的song : {}",song);
        //step2、【写操作】将歌曲添加到歌单中(建立关联关系):添加中间表记录
//        int a = 0 ;int b = 2/a ; //抛出算数异常
        if(rows == 1){

            /*
             *1、song 对象中 id 为 null?应该怎么获取?大
                       在 insert 标签中 增加属性: useGeneratedKeys="true" KeyProperty="id" keycolumn="id"
             *2、歌曲插入成功，但中间表插入失败，这样正常吗?为什么?
                       在多次写操作时，需要增加 声明式事务注解 @Transactional，保证多次写操作同时成功或失败。
              */

            SonglistSong songlistSong = new SonglistSong(songlistId, song.getId());
            rows = songlistSongMapper.insert(songlistSong);
        }
        return rows;
    }

    /**
     * @Description: 删除指定歌单下的某个歌曲（接触某个歌单与某个歌曲的关联关系）
     * @Author: cheng_jianzhen
     * @CreateTime: 2024/1/19 9:36
     * @param: songlistId
     * @param: songId
     * @return: int
     **/
    @Override
    public int deleteSongBySonglistIdSongId(Integer songlistId, Integer songId) {
        return songlistSongMapper.deleteSongBySonglistIdSongId(songlistId,songId);
    }


    /**
     * @Description: 查询所有歌曲
     * @Author: cheng_jianzhen
     * @CreateTime: 2024/1/19 13:25
     * @return: com.niit.musicserver.common.Result
     **/
    @Override
    public List<Song> getAllSongs() {
        return songMapper.getAllSongs();
    }


    /**
     * @Description: 根据歌曲ID查询歌曲
     * @Author: cheng_jianzhen
     * @CreateTime: 2024/1/19 13:30
     * @param: songId
     * @return: com.niit.musicserver.common.Result
     **/
    @Override
    public Song getSongById(Integer songId) {
        return songMapper.getSongById(songId);
    }


    /**
     * @Description: 基于单表添加歌曲
     * @Author: cheng_jianzhen
     * @CreateTime: 2024/1/19 13:37
     * @param: song
     * @return: com.niit.musicserver.common.Result
     **/
    @Override
    public int addSong(Song song) {
        return songMapper.addSong(song);
    }


    /**
     * @Description: 基于单表更新歌曲信息
     * @Author: cheng_jianzhen
     * @CreateTime: 2024/1/19 13:37
     * @param: songId
     * @param: updatedSong
     * @return: com.niit.musicserver.common.Result
     **/
    @Override
    public int updateSong(Integer songId, Song updatedSong) {
        return songMapper.updateSong(songId, updatedSong);
    }


    /**
     * @Description: 更新歌曲信息根据歌曲ID删除歌曲
     * @Author: cheng_jianzhen
     * @CreateTime: 2024/1/19 14:35
     * @param: songId
     * @return: com.niit.musicserver.common.Result
     **/
    @Override
    public int deleteSongById(Integer songId) {
        return songMapper.deleteSongById(songId);
    }


}
